package org.example.Monotone_stack;

import java.util.Arrays;
import java.util.LinkedList;
import java.util.Stack;

public class The_next_bigger_element_II {
    public static void main(String[] args) {
        //下一个更大元素 II

        //给定一个循环数组 nums （ nums[nums.length - 1] 的下一个元素是 nums[0] ），返回 nums 中每个元素的 下一个更大元素 。
        //数字 x 的 下一个更大的元素 是按数组遍历顺序，这个数字之后的第一个比它更大的数，这意味着你应该循环地搜索它的下一个更大的数。如果不存在，则输出 -1 。
        int[] nums = {1,2,3,4,5,6,5,4,5,1,2,3};
        int[] ints = nextGreaterElements(nums);
        System.out.println(Arrays.toString(ints));
    }


    //单调栈5ms
    public static int[] nextGreaterElements(int[] nums) {
        int[] res = new int[nums.length];
        Arrays.fill(res,-1);
        LinkedList<Integer> linkedList = new LinkedList<>();
        for (int i = 0; i < 2*nums.length; i++) {
            while(!linkedList.isEmpty() && nums[i% nums.length] > nums[linkedList.getLast()]){
                res[linkedList.removeLast()] = nums[i% nums.length];
            }
            linkedList.add(i% nums.length);
        }
        System.out.println(linkedList);
        return res;
    }

    //暴力45ms
    public static int[] nextGreaterElements2(int[] nums) {
        int[] res = new int[nums.length];
        Arrays.fill(res,-1);
        for (int i = 0; i < nums.length; i++) {
            int j = i;
            if (i == nums.length-1) j = 0;
            else j++;
            while(j != i){
                if (nums[j] > nums[i]){
                    res[i] = nums[j];
                    break;
                }
                if (j == nums.length-1) j = 0;
                else j++;
            }
        }
        return res;
    }
}
